HBase写流程
存储结构介绍
- RegionServer管理着多个region;每个RegionServer都有对应的HLog实例
- region是Hbase存储的单元,数据都存在region中,需要注意的是每一个region只存储一个column family的数据而且只是这个列族的一部分;当region达到一定的大小之后会根据rowkey的排序划分为多个region;每个region里面包含多个store对象;每个store对象里面包含一个memstore和一个或多个storefile
- memstore是数据在内存中的实体;并且一般是有序的;当有数据写入的时候会先写入到memstore;当memstore大小达到上线之后store会flish(创建)
storefile(hfile的一层封装)文件;最终写入到hdfs中。 - Hlog保证了内存中的数据不会丢失;WAL的一种实现预写日志;regionserver会将更新操作记录到memstore然后记录到hlog中;只有当hlog更新完成之后这条记录才是真正成功写入。(WAL是先写入日志再写入内存;hbase不同版本写入顺序不同)
写入流程
- client客户端会首先访问zookeeper;从中获取表的相关信息和表的region的相关信息;根据要插入的rowkey获取指定的regionserver的信息;如果是批量提交会把rowkey根据hregion location进行分组;当我们得到了要访问的regionserver之后;
- client会向regionserver发出写请求;将数据发送给这个regionserver;这个regionserver收请求之后;首先会进行各种检查操作比如看一下这个regionserver是不是只读状态;memstore是否超过了broking memstore size的大小;之后进行数据写入;将数据同时写入memstore和hlog;这俩者都写入成功后才算完结。这里面比较复杂;写入memstore和hlog是事务性操作;需要获取相关的锁;要么全部成功要么全失败。
- 当memstore大小达到阈值之后store会flish成storefile文件;当storefile文件达到一定数量后会促发combine合并机制;将多个storefile文件合并成一个大的storefile文件;如果单个stroefile文件达到了一定的阈值会触发split机制;将regionserver一分为二;之后hmaster给两个region分配相应的regionserver进行管理;从而分担压力。
简要概括
- Client会先访问zookeeper, 得到对应的regionserver地址
- Client对regionserver发起写请求, Regionserver接受数据写入内存
- 当memstore的大小达到一定的值后, Flush到storefile并存储到Hdfs
HBase读流程
- client读取数据首先链接zookeeper,通过访问meta 表和regisonserver的节点信息;将meta 表缓存到本地;通过缓存的meta 表获取要访问的表所对应的regionserver的信息,让后向对应的regionserver发起读请求;
- regionsserver收到读请求后做一些复杂的操作见下面红字
- meta表就相当于一个目录;可以快速定位到数据的实际位置
简要概括
- Client会先访问zookeeper, 得到对应的regionserver地址
- Client对regionserver发起读请求
- 当regionserver收到client的读请求后, 先扫描自己的memstore, 再扫描
blockcache (加速读内容缓存区) 如果还没找到则 Storefile中读取数据, 然后将数据返回给Client
HBase模块协作
◆Hbase启动时发生了什么?
◆当regionserver失效后会发生什么?
◆当hmaster失效后会发生什么?
Hbase启动
- HMaster启动、注册到Zookeeper,等待RegionServer汇报;
- RegionServer注册到Zookeeper,并向HMaster汇报
- HMaster对各个Regionserver (包括失效的) 的数据进行整理, 分配region和meta信息。
注意:集群中在注册Zookeeper之前首先会将自己注册到backupmaster节点;这里是因为在集群中有多个master;在不确定谁是acive之前都会先注册到backupmaster节点中;当某个节点成为activemaster就会删除自身的在backupmaster的信息;才会实例化相关的类比如masterServertive,serverManager,tableStaticManager
Hmaster将meta表交给zookeeper就没事了;backupmaster节点里的unactive的master会从action master处定期更新自己的meta表保证最新。
regionserver失效
- Hmaster将失效regionserver上的region分配到其他节点
- Hmaster更新hbase: Meta表以保证数据正常访问:
HMaster失效
- (集群中)处于backup状态的其他hmaster节点推选出一个转为active状态
- (非集群)数据能正常读写, 但是不能创建删除表, 也不能更改表结构
Shell命令实战
Hbase Shell命令
◆ HBase shell基础命令: status, List, create Table等
◆ HBase shell数据模型操作命令: Put, get, delete, Scan等
详细命令
1 | # HBase shell中的帮助命令非常强大,使用help获得全部命令的列表,使用help ‘command_name’获得某一个命令的详细信息 |
HBase Java API
HBase数据库操作类
- 开发hbase数据库操作类
- 获取数据库链接;其代码在hbase-example\hbase-api-test\HBaseConn中
- 增删改查模块编写
- 增删改查方法测试
Hbase数据过滤
过滤器能干什么?
- Hbase为筛选数据提供了一组过滤器, 通过过滤器可以在hbase中的数
据的多个维度 (行kitakatta, 列bu, 数据版本) 上进行对数据的筛选操作 - 通常来说, 通过行键 、 列来筛选数据的应用场景较多
- 基于行的过滤器
- Prefixfilter: 行的前缀匹配.
scan ‘FileTable’,{FILTER=>”PrefixFilter(‘001’)”} - Pagefilter: 基于行的分页
- Prefixfilter: 行的前缀匹配.
- 基于列的过滤器
- Columnprefixfilter: 列前缀匹配
- Firstkeyonlyfilter: 只返回每一行的第一列
- 基于单元值的过滤器
- Keyonlyfilter: 返回的数据不包括单元值, 只包含行键与列
- Timestampsfilter: 根据数据的时间戳版本进行过滤
- 基于列和单元值的过滤器.
- Singlecolumnvaluefilter: 对该列的单元值进行比较过滤
- Singlecolumnvalueexcludefilter: 对该列的单元值进行比较过滤
按实现划分可划分为:
比较过滤器
- 比较过滤器通常需要一个比较运算符以及一个比较器来实现过滤
- RowFilter, Familyfilter, Qualifierfilter, Valuefilter
常用过滤器
Java Api实现HBase操作类
开发HBase数据库操作类
1 | package com.kun.hbase; |
1 | package com.kun.hbase; |
增删查操作
1 | package com.kun.hbase; |
通过多种过滤器过滤数据,实现HBase高级查询
通过多种过滤器过滤数据, 实现HBase高级查询
1 | package com.kun.hbase; |
自定义过滤器
◆ 你真的需要自定义过滤器吗? (一般不需要自定义)
◆ 如何实现自定义过滤器 (参考官网)